//
//  BEDataExtension.swift
//  BasicExtensions
//
//  Created by JY_NEW on 2022/3/9.
//

import Foundation

extension Data {
    /// 将数值类型转换为Data
    public init<T>(value: T) {
        var v = value
        self.init(bytes: &v, count: MemoryLayout<T>.size)
    }
    /// 将数据转换为数据类型
    public func asValue<T: ExpressibleByIntegerLiteral>() -> T {
        return self.asValue(default: 0)
    }
    /// 将数据转换为数据类型
    public func asValue<T: ExpressibleByFloatLiteral>() -> T {
        return self.asValue(default: 0.0)
    }
    /// 将数据转换为数据类型
    public func asValue<T>(default v: T) -> T {
        var value: T = v
        (self as NSData).getBytes(&value, length: MemoryLayout<T>.size)
        return value
    }
    /// 添加数值
    public mutating func append<T>(value: T) {
        self.append(.init(value: value))
    }
}
/// 适配JAVA
extension Data {
    /// 将数值类型转换为Data
    public init<T>(javaValue: T) {
        self.init(value: javaValue)
        self.reverse()
    }
    /// 将数据转换为数据类型
    public func asJavaValue<T: ExpressibleByIntegerLiteral>() -> T {
        return self.asJavaValue(default: 0)
    }
    /// 将数据转换为数据类型
    public func asJavaValue<T: ExpressibleByFloatLiteral>() -> T {
        return self.asJavaValue(default: 0.0)
    }
    /// 将数据转换为数据类型
    public func asJavaValue<T>(default v: T) -> T {
        var value: T = v
        var data = self
        data.reverse()
        (data as NSData).getBytes(&value, length: MemoryLayout<T>.size)
        return value
    }
    /// 添加数值
    public mutating func append<T>(javaValue: T) {
        self.append(.init(javaValue: javaValue))
    }
}
